package com.shujia.wyh.day04.homework;
import java.util.Scanner;
/*
    二分法查找操作：
        前提：查找的序列前提要是有序的！！！
        使用二分法查找有序数组中元素。找到返回索引，不存在输出-1。  分析：二分法查找的前提是数组有序。

        假如有一组数为3，12，24，36，55，68，75，88要查给定的值24.可设三个变量
        front，mid，end分别指向数据的上界，中间和下界，mid=（front+end）/2.
        1)开始令front=0（指向3），end=7（指向88），则mid=3（指向36）。因为mid>x， 故应在前半段中查找。
        2)令新的end=mid-1=2，而front=0不变，则新的mid=1。此时x>mid，故确定应  在后半段中查找。
        3)令新的front=mid+1=2，而end=2不变，则新mid=2，此时a[mid]=x，查找成功。
        4)如要查找的数不是数列中的数，例如x=25，当第三次判断时，x>a[mid]，按以上规律，令front=mid+1，
        即front=3，出现front>end的情况，表示查找不成功。
 */
public class Test4 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

        //定义一个数组，动态初始化
        int[] arr = {3, 12, 34, 36, 55, 68, 75, 88};
        //定义一个要查找的元素
//        int number = 68;
        System.out.println("请输入您要查找的元素：");
        int number = sc.nextInt();

        //判断这个序列是否为空
        if (arr == null) {
            System.out.println("该数组为空！！无法查找");
        } else {
            //定义一个起始位置
            int front = 0;
            //定义一个结束位置；
            int end = arr.length - 1;
            //定义一个标志位
            boolean flag = true;

            //因为不确定要查找多少次，所以使用while循环
            while (front <= end) {
                //计算中间位置的索引
                int mid = (front + end) / 2;
                //获取中间索引对应位置的元素值
                int midValue = arr[mid];

                if (number == midValue) {
                    System.out.println("找到该元素，元素的索引为：" + mid);
                    flag = false;
                    break;
                } else if (number < midValue) {
                    end = mid - 1;
                } else {
                    front = mid + 1;
                }
            }

            if(flag){
                System.out.println(-1);
            }

        }

    }
}
